package cn.tedu.submarine;
import javax.swing.JFrame;
import javax.swing.JPanel; //1.
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;

/**
 * 整个游戏窗口
 */
public class World extends JPanel { //2.
    /**
     * 窗口的宽
     */
    public static final int WIDTH = 641;
    /**
     * 窗口的高
     */
    public static final int HEIGHT = 479;

    //如下这一堆对象就是窗口中你所看到的对象
    private Battleship ship = new Battleship(); //战舰对象
    private SeaObject[] submarines = {}; //潜艇数组
    private Mine[] mines = {}; //水雷数组
    private Bomb[] bombs = {}; //炸弹数组

    /**
     * 生成潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)对象
     * @return 返回潜艇
     */
    private SeaObject nextSubmarine(){
        Random rand = new Random(); //随机数对象
        int type = rand.nextInt(20); //0到19之间
        if(type<10){ //0到9时，返回侦察潜艇对象
            return new ObserveSubmarine();
        }else if(type<16){ //10到15时，返回鱼雷潜艇对象
            return new TorpedoSubmarine();
        }else{ //16到19时，返回水雷潜艇对象
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0; //潜艇入场计数
    /**
     * 潜艇入场
     */
    private void submarineEnterAction(){ //每10毫秒走一次
        subEnterIndex++; //每10毫秒增1
        if(subEnterIndex%40==0){ //每400(40*10)毫秒走一次
            SeaObject obj = nextSubmarine(); //获取潜艇对象
            submarines = Arrays.copyOf(submarines,submarines.length+1); //扩容
            submarines[submarines.length-1] = obj; //将obj添加到submarines最后一个元素上
        }
    }

    private int mineEnterIndex = 0; //水雷入场计数
    /**
     * 水雷入场
     */
    private void mineEnterAction(){ //每10毫秒走一次
        mineEnterIndex++; //每10毫秒增1
        if(mineEnterIndex%100==0){ //每1000(100*10)毫秒走一次
            for(int i=0;i<submarines.length;i++){ //遍历所有潜艇
                if(submarines[i] instanceof MineSubmarine){ //若潜艇为水雷潜艇
                    MineSubmarine ms = (MineSubmarine)submarines[i]; //将潜艇转换为水雷潜艇类型
                    Mine obj = ms.shootMine(); //获取水雷对象
                    mines = Arrays.copyOf(mines,mines.length+1); //扩容
                    mines[mines.length-1] = obj; //将obj添加到mines最后一个元素上
                }
            }
        }
    }

    /**
     * 海洋对象移动
     */
    private void moveAction(){ //每10毫秒走一次
        for(int i=0;i<submarines.length;i++){ //遍历所有潜艇
            submarines[i].move(); //潜艇动
        }
        for(int i=0;i<mines.length;i++){ //遍历所有水雷
            mines[i].move(); //水雷动
        }
        for(int i=0;i<bombs.length;i++){ //遍历所有炸弹
            bombs[i].move(); //炸弹动
        }
    }

    /**
     * 启动程序的执行
     */
    private void action(){
        Timer timer = new Timer(); //定时器对象
        int interval = 10; //定时间隔(以毫秒为单位)
        timer.schedule(new TimerTask() {
            public void run() { //定时干的事----每10毫秒自动执行
                submarineEnterAction(); //潜艇入场
                mineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                repaint(); //重画----系统自动调用paint()方法
            }
        }, interval, interval); //定时计划表
    }

    /**
     * 重写paint()画
     * @param g 系统自带的画笔
     */
    public void paint(Graphics g){ //每10毫秒走一次
        Images.sea.paintIcon(null,g,0,0); //画海洋图---不要求掌握
        ship.paintImage(g); //画战舰
        for(int i=0;i<submarines.length;i++){ //遍历所有潜艇
            submarines[i].paintImage(g); //画潜艇
        }
        for(int i=0;i<mines.length;i++){ //遍历所有水雷
            mines[i].paintImage(g); //画水雷
        }
        for(int i=0;i<bombs.length;i++){ //遍历所有炸弹
            bombs[i].paintImage(g); //画炸弹
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame(); //3.
        World world = new World(); //会创建窗口中的那一堆对象
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+40);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true); //自动调用paint()方法

        world.action(); //启动程序的执行
    }
}
























